package main

import (
	"log" // 日志库
	"net/http"

	"gorm.io/driver/mysql" // MySQL 驱动
	"gorm.io/gorm"         // GORM ORM 库

	"land/config"
	"land/models"
	"land/routers/api"
	"land/routers/data"
)

func init() {
	dsn := "root:123456@tcp(localhost:3306)/yh_database?charset=utf8mb4&parseTime=True&loc=Local"
	var err error

	// &gorm.Config{} 创建一个新的 gorm.Config 实例，并返回其指针。空的实例使用 GORM 的默认配置。
	config.Db, err = gorm.Open(mysql.Open(dsn), &gorm.Config{})
	if err != nil {
		// 记录下连接数据库失败的错误信息，便于后续调试和排查问题。
		// log.Fatalf 在输出日志后，会调用 os.Exit(1)，导致程序立即退出，并返回状态码 1，表示程序因错误而异常终止。
		log.Fatalf("无法连接数据库: %v", err)
	}

	log.Println("数据库连接成功")

	// 先迁移 User 表
	// 自动迁移功能会根据结构体定义的字段，在数据库中创建相应的表结构。
	// AutoMigrate 不会删除已存在的字段或表，只会进行增量的更新。
	err = config.Db.AutoMigrate(&models.User{}, &models.Comment{})
	if err != nil {
		log.Fatalf("用户表或评论表迁移失败: %v", err)
	}

	// 检查用户表已经存在
	if tableExists := config.Db.Migrator().HasTable(&models.User{}); !tableExists {
		log.Fatal("用户表未找到")
	}

	log.Println("数据库迁移成功")

	// 注册 HTTP 处理函数
	http.HandleFunc("/api/comments", api.GetCommentsHandler)  // 获取评论
	http.HandleFunc("/api/addcomment", api.AddCommentHandler) // 添加评论
	// Post 请求处理函数
	http.HandleFunc("/api/register", api.RegisterHandler) //注册用户
	// Post 请求处理函数
	http.HandleFunc("/api/login", api.LoginHandler) //用户登录
	// Post 请求处理函数
	http.HandleFunc("/data/upload", data.ImageUploadHandler) //数据上传
	// Post 请求处理函数
	http.HandleFunc("/data/analyse", data.ImageAnalysisHandler) //数据分析
	// Post 请求处理函数
	http.HandleFunc("/data/select", data.SelectHandler) //数据查询
	// Post 请求处理函数
	http.HandleFunc("/data/show", data.ShowHealthHandler) //展示图像

	// 使用文件服务器提供"/uploads"路径下的文件
	fs := http.FileServer(http.Dir("./uploads"))
	http.Handle("/uploads/", http.StripPrefix("/uploads/", fs))

	// 使用文件服务器提供"docs"路径下的前端
	fc := http.FileServer(http.Dir("./docs"))
	http.Handle("/docs/", http.StripPrefix("/docs/", fc))

}

func main() {

	log.Println("服务器启动，访问 http://localhost:8080") // 服务器启动日志
	log.Fatal(http.ListenAndServe(":80", nil))    // 启动 HTTP 服务器

}
